/*
 * Copyright (C) 2012  E-dance Studio Harbin Institute of Technology 
 * Project:campusmobile
 * Author: 初楷博
 * Create Date: 2012-5-23上午11:02:42
 */
package hit.edance.campusmobile.chat.database;

import android.content.Context;
import android.database.SQLException;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteDatabase.CursorFactory;
import android.database.sqlite.SQLiteOpenHelper;

/**   
 * 数据库UTIL
 * 
 * @Project campusmobile
 * @Package hit.edance.campusmobile.chat.database
 * @Class DBUtil
 * @Date 2012-5-23 上午11:02:42
 * @author 初楷博
 * @version 1.0
 * @since 1.0
 */
public class DBUtil {

	/**
	 * 声明数据库管理器实例
	 */
	private DatabaseHelper mDbHelper;	
	/**
	 * 声明数据库对象
	 */
	private SQLiteDatabase mDb;	
	
	private static final String DATABASE_NAME = "campusmobile.db";
	private static final int DATABASE_VERSION = 1;
	
	private final Context mCtx;
	
	private static class DatabaseHelper extends SQLiteOpenHelper{
		/**
		 * 建立AutoAccount表，表中有_id、account
		 */
		final String CREATE_AUTOACCOUNT = "create table AutoAccount (_id integer primary key autoincrement, "
			+ "account text not null unique);";	
		
		/**
		 * 建立ChatHistory表，表中有_id主键、myid我的jabberId、 content聊天内容、 time时间、 itsid对方id、 tag方向标记
		 */
		final String CREATE_CHATHISTORY = "create table ChatHistory (_id integer primary key autoincrement, "
			+ "myid TEXT, content TEXT, time DATE, itsid TEXT, tag integer );";
		
		/**
		 * 建立keyvalue表，表中有_id主键、key关键字、value值
		 */
		final String CREATE_KEYVALUE = "create table keyvalue (_id integer primary key autoincrement, "
			+ "key text not null, value text not null);";
		
		
		
		/**
		 * 删除表AutoAccount
		 */
		final String DROP_AUTOACCOUNT = "DROP TABLE IF EXISTS AutoAccount"; 
		/**
		 * 删除表ChatHistory
		 */
		final String DROP_CHATHISTORY = "DROP TABLE IF EXISTS ChatHistory"; 
		
		/**
		 * 删除表keyvalue
		 */
		final String DROP_KEYVALUE = "DROP TABLE IF EXISTS keyvalue";
		
		DatabaseHelper(Context context) {
			super(context, DATABASE_NAME, null, DATABASE_VERSION);
		}
		
		public DatabaseHelper(Context context, String name,
				CursorFactory factory, int version) {
			super(context, name, factory, version);
			// TODO Auto-generated constructor stub
		}

		@Override
		public void onCreate(SQLiteDatabase db) {
			db.beginTransaction(); // 开始事物
			try {
			    // 所有表同时创建，若有一条错误则都插不进去
				db.execSQL(CREATE_AUTOACCOUNT);	//建立数据表AutoAccount
				db.execSQL(CREATE_CHATHISTORY);	//建立数据表ChatHistory
				db.execSQL(CREATE_KEYVALUE);	//建立数据表keyvalue
			    db.setTransactionSuccessful();	//设置事务成功标记
//			    System.exit(0);
			    
			} finally{
				db.endTransaction();	//如果没有成功标记，则回滚，否则提交。
			}
		}

		@Override
		public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
			// TODO Auto-generated constructor stub
			try {
			    // 所有表同时创建，若有一条错误则都插不进去
				db.execSQL(DROP_AUTOACCOUNT);	//删除掉数据表，如果有的话
				db.execSQL(DROP_CHATHISTORY);   //删除掉数据表，如果有的话
				db.execSQL(DROP_KEYVALUE);      //删除掉数据表，如果有的话
			    db.setTransactionSuccessful();	//设置事务成功标记
//			    System.exit(0);
			    
			} finally{
				db.endTransaction();	//如果没有成功标记，则回滚，否则提交。
			}
			onCreate(db);	//重新创建数据表并初始化数据
		}
		
	}
	/**
	 * 构造方法中初始化Context对象
	 * @param ctx
	 */
	public DBUtil(Context ctx) {
		this.mCtx = ctx;
	}
	/**
	 * 打开数据库实例
	 * @return	返回DbHelper本身的实例
	 * @throws SQLException
	 */
	public DBUtil open() throws SQLException {
		mDbHelper = new DatabaseHelper(mCtx);	//根据上下文对象建立数据库管理器实例
		return this;	//返回数据库适配器对象本身的实例
	}
	/**
	 * @return 可写的数据库实例
	 */
	public SQLiteDatabase getWritableDB(){
		return mDb = mDbHelper.getWritableDatabase();	//获取可写的数据库实例
	}
	/**
	 * @return 可读的数据库实例
	 */
	public SQLiteDatabase getReadableDB(){
		return mDb = mDbHelper.getReadableDatabase();	//获取可读的数据库实例
	}
	
	/**
	 * 关闭数据库管理器
	 */
	public void close() {
		if(mDb != null)
			mDb.close();
		if(mDbHelper != null)
			mDbHelper.close();	//Close any open database object.
	}

}
